/*****************************************************************
 ** 描 述: 全局common
 **-----------------------------------------------------------------
 ******************************************************************/


/**
 * 初始化系统信息
 */
export const initSystemInfo = () => {
    // 获取系统信息
    const systemInfo = uni.getSystemInfoSync();
    // 屏幕高度
    const windowH = systemInfo.windowHeight;
    // 屏幕宽度
    const windowW = systemInfo.windowWidth;
    // 状态栏高度
    const statusH = systemInfo.statusBarHeight;
    let info = {
        // 获取状态栏的高度
        statusBarHeight: statusH || 0,
        // 获取屏幕高宽
        windowHeight: windowH,
        windowWidth: windowW,
        // 获取小程序顶部标题栏的高度
        appletTitleBarHeight: 44,
        // 获取内容高度
        contentHeight: 0,
        // 获取吸顶高度
        offsetTop: 0
    }

    //获取小程序顶部标题栏的高度，以及内容高度
    // #ifdef MP-WEIXIN
    const menuButtonInfo = uni.getMenuButtonBoundingClientRect();
    const appletTitleH = (menuButtonInfo.top - statusH) * 2 + menuButtonInfo.height;
    info.appletTitleBarHeight = appletTitleH;
    info.contentHeight = windowH - statusH - appletTitleH;
    // #endif

    // 获取app内容高度
    // #ifdef APP-PLUS
    info.contentHeight = windowH - statusH;
    info.offsetTop = statusH + info.appletTitleBarHeight;
    // #endif

    // 获取h5内容高度
    // #ifdef H5
    info.contentHeight = windowH - statusH - 44 - 50;
    // #endif
    
    return info;
}

/**
 * 日期转换为星期
 * @param {String} d
 */
export const getMyDay = (d) => {
    var w;
    if (new Date(d).getDay() == 0) w = '星期天';
    if (new Date(d).getDay() == 1) w = '星期一';
    if (new Date(d).getDay() == 2) w = '星期二';
    if (new Date(d).getDay() == 3) w = '星期三';
    if (new Date(d).getDay() == 4) w = '星期四';
    if (new Date(d).getDay() == 5) w = '星期五';
    if (new Date(d).getDay() == 6) w = '星期六';
    return w;
}

/**
 * 日期时间补0
 * @param {Number} s
 */
export const makeUp = (s) => {
    return s < 10 ? '0' + s : s;
}

/**
 * 时间格式返回
 * @param {String} value
 */
export const returnDate = (value) => {
    let v = {
        date: new Date(), //时间
        timeStamp: Date.parse(new Date()), //时间戳-精确到秒
        year: '', //2019
        month: '', //02
        yearMonth: '', //2019-08
        monthData: '', //08-08
        numDate: '', //2019-08-08
        evenDate: '', //2019/08/08
        strDate: '', //2019年08月08日
        time: '', //2019-08-08 12:12
        timeAll: '', //2019-08-08 12:12:12
        weekDate: '', //2019年08月08日 星期三 12:12
        weekTime: '', //2019年08月08日 星期三
        nowMonthFirstDay: '', //08-01 当月第一天
        nowMonthLastDay: '', //08-31 当月最后一天
        mrsf: '', //08-08 12:12
    };
    if (value) {
        v.date = new Date(value.replace(/\-/g, '/'))
        v.timeStamp = Date.parse(v.date)
    }
    let t = v.date;
    let y = t.getFullYear();
    let m = t.getMonth() + 1;
    let d = t.getDate();
    let h = t.getHours();
    let s = t.getMinutes();
    let min = t.getSeconds();
    v.year = y;
    v.month = makeUp(m);
    v.date = d;
    v.MD = `${makeUp(m)}月${makeUp(d)}日`
    v.yearMonth = `${y}-${makeUp(m)}`;
    v.monthData = `${makeUp(m)}-${makeUp(d)}`;
    v.numDate = `${y}-${makeUp(m)}-${makeUp(d)}`;
    v.evenDate = `${y}/${makeUp(m)}/${makeUp(d)}`;
    v.strDate = `${y}年${makeUp(m)}月${makeUp(d)}日`;
    v.time = `${y}-${makeUp(m)}-${makeUp(d)} ${makeUp(h)}:${makeUp(s)}`;
    v.timeAll = `${y}-${makeUp(m)}-${makeUp(d)} ${makeUp(h)}:${makeUp(s)}:${makeUp(min)}`;
    v.weekDate = `${y}年${makeUp(m)}月${makeUp(d)}日 ${getMyDay(v.date)} ${makeUp(h)}:${makeUp(s)}`;
    v.weekTime = `${y}年${makeUp(m)}月${makeUp(d)}日 ${getMyDay(v.date)}`;
    v.nowMonthFirstDay = `${y}-${makeUp(m)}-01`;
    v.nowMonthLastDay = `${y}-${makeUp(m)}-${getMonthLastDay(makeUp(m))}`;
    v.mrsf = `${makeUp(m)}-${makeUp(d)} ${makeUp(h)}:${makeUp(s)}`;
    
    // 获取月的最后一天
    function getMonthLastDay(month = (new Date().getMonth() + 1)){
        return new Date(new Date().getFullYear(), month, 0).getDate()
    }
    
    return v;
}

/**
 * parseTime-格式化时间
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string | null}
 */
export const parseTime = (time, cFormat) => {
    if (arguments.length === 0 || !time) {
        return null
    }
    const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
    let date
    if (typeof time === 'object') {
        date = time
    } else {
        if ((typeof time === 'string')) {
            if ((/^[0-9]+$/.test(time))) {
                time = parseInt(time)
            } else {
                time = time.replace(new RegExp(/-/gm), '/')
            }
        }
        if ((typeof time === 'number') && (time.toString().length === 10)) {
            time = time * 1000
        }
        date = new Date(time)
    }
    const formatObj = {
        y: date.getFullYear(),
        m: date.getMonth() + 1,
        d: date.getDate(),
        h: date.getHours(),
        i: date.getMinutes(),
        s: date.getSeconds(),
        a: date.getDay()
    }
    const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
        const value = formatObj[key]
        if (key === 'a') {
            return ['日', '一', '二', '三', '四', '五', '六'][value]
        }
        return value.toString().padStart(2, '0')
    })
    return time_str
}

export const deepClone = (source)=> {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'deepClone')
  }
  const targetObj = source.constructor === Array ? [] : {}
  Object.keys(source).forEach(keys => {
	  console.log("keys",keys)
    if (source[keys] && typeof source[keys] === 'object') {
      targetObj[keys] = deepClone(source[keys])
    } else {
      targetObj[keys] = source[keys]
    }
  })
  return targetObj
}

export const MD5 = (sMessage) =>{
	function RotateLeft(lValue, iShiftBits)
	{
	    return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits)); }
	function AddUnsigned(lX,lY)
	{
	    var lX4,lY4,lX8,lY8,lResult;
	    lX8 = (lX & 0x80000000);
	    lY8 = (lY & 0x80000000);
	    lX4 = (lX & 0x40000000);
	    lY4 = (lY & 0x40000000);
	    lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
	    if (lX4 & lY4) {
	        return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
	    }
	    if (lX4 | lY4) {
	        if (lResult & 0x40000000) {
	            return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
	        } else {
	            return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
	        }
	    } else {
	        return (lResult ^ lX8 ^ lY8);
	    }
	}
	function F(x,y,z)
	{
	    return (x & y) | ((~x) & z); }
	function G(x,y,z)
	{
	    return (x & z) | (y & (~z)); }
	function H(x,y,z)
	{
	    return (x ^ y ^ z); }
	function I(x,y,z)
	{
	    return (y ^ (x | (~z))); }
	function FF(a,b,c,d,x,s,ac)
	{
	    a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
	    return AddUnsigned(RotateLeft(a, s), b);
	}
	function GG(a,b,c,d,x,s,ac)
	{
	    a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
	    return AddUnsigned(RotateLeft(a, s), b);
	}
	function HH(a,b,c,d,x,s,ac)
	{
	    a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
	    return AddUnsigned(RotateLeft(a, s), b);
	}
	function II(a,b,c,d,x,s,ac)
	{
	    a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
	    return AddUnsigned(RotateLeft(a, s), b);
	}
	function ConvertToWordArray(sMessage)
	{
	    var lWordCount;
	    var lMessageLength = sMessage.length;
	    var lNumberOfWords_temp1=lMessageLength + 8;
	    var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
	    var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
	    var lWordArray=Array(lNumberOfWords-1);
	    var lBytePosition = 0;
	    var lByteCount = 0;
	    while ( lByteCount < lMessageLength ) {
	        lWordCount = (lByteCount-(lByteCount % 4))/4;
	        lBytePosition = (lByteCount % 4)*8;
	        lWordArray[lWordCount] = (lWordArray[lWordCount] | (sMessage.charCodeAt(lByteCount)<<lBytePosition));
	        lByteCount++;
	    }
	    lWordCount = (lByteCount-(lByteCount % 4))/4;
	    lBytePosition = (lByteCount % 4)*8;
	    lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
	    lWordArray[lNumberOfWords-2] = lMessageLength<<3;
	    lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
	    return lWordArray;
	}
	function WordToHex(lValue)
	{
	    var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
	    for (lCount = 0; lCount<=3; lCount++) {
	        lByte = (lValue>>>(lCount*8)) & 255;
	        WordToHexValue_temp = "0" + lByte.toString(16);
	        WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
	    }
	    return WordToHexValue;
	}
	var x=Array();
	var k,AA,BB,CC,DD,a,b,c,d
	var S11=7, S12=12, S13=17, S14=22;
	var S21=5, S22=9 , S23=14, S24=20;
	var S31=4, S32=11, S33=16, S34=23;
	var S41=6, S42=10, S43=15, S44=21;
	// Steps 1 and 2. Append padding bits and length and convert to words
	x = ConvertToWordArray(sMessage);
	// Step 3. Initialise
	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
	// Step 4. Process the message in 16-word blocks
	for (k=0; k<x.length; k+=16) {
	    AA=a; BB=b; CC=c; DD=d;
	    a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
	    d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
	    c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
	    b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
	    a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
	    d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
	    c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
	    b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
	    a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
	    d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
	    c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
	    b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
	    a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
	    d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
	    c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
	    b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
	    a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
	    d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
	    c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
	    b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
	    a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
	    d=GG(d,a,b,c,x[k+10],S22,0x2441453);
	    c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
	    b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
	    a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
	    d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
	    c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
	    b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
	    a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
	    d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
	    c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
	    b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
	    a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
	    d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
	    c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
	    b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
	    a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
	    d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
	    c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
	    b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
	    a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
	    d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
	    c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
	    b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
	    a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
	    d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
	    c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
	    b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
	    a=II(a,b,c,d,x[k+0], S41,0xF4292244);
	    d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
	    c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
	    b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
	    a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
	    d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
	    c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
	    b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
	    a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
	    d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
	    c=II(c,d,a,b,x[k+6], S43,0xA3014314);
	    b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
	    a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
	    d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
	    c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
	    b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
	    a=AddUnsigned(a,AA); b=AddUnsigned(b,BB); c=AddUnsigned(c,CC); d=AddUnsigned(d,DD);
	}
	// Step 5. Output the 128 bit digest
	var temp= WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
	return temp.toLowerCase();
}

export const formatLocation = (longitude, latitude)=>{
	if (typeof longitude === 'string' && typeof latitude === 'string') {
		longitude = parseFloat(longitude)
		latitude = parseFloat(latitude)
	}

	longitude = longitude.toFixed(2)
	latitude = latitude.toFixed(2)

	return {
		longitude: longitude.toString().split('.'),
		latitude: latitude.toString().split('.')
	}
}
